package com;

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
/*

定义变量和初始化数据：
ks：存储密钥。
keyword：存储关键词数组。
index：存储索引数组。
trapdoor 和 st：用于存储陷门和临时状态。
wm：关键词数量。
um：每个关键词的索引数量。
crt 和 len：计数和长度变量。
conn：Redis 连接。
连接 Redis 服务器：
连接到 localhost 上的 Redis 服务器。
生成密钥：
调用 HKeyGen 函数生成密钥。
更新操作：
调用 HUpdate 函数更新 Redis 数据。
释放 Redis 连接：
调用 redisFree 释放连接。
生成陷门：
调用 HTrapdoor 函数生成陷门。
执行搜索：
调用 HSearch 函数执行搜索操作。
输出结果：
输出搜索结果。
 */

public class Hscheme {
    private static final int HASH_LEN = 32;
    private static final int WORD_LEN = 16;
    private static final int CLEN = 32;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    public void HschemeTest() {
        byte[] ks = new byte[HASH_LEN];
        byte[] keyword = {
                0x00, (byte) 0xff, (byte) 0xff, (byte) 0xfe, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff
        };

        byte[] index = {
                (byte) 0xFF, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xfe, (byte) 0xff, (byte) 0xff, 0x11,
                (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
                (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xfe, (byte) 0xff, (byte) 0xff, (byte) 0xff,
                (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff
        };

        byte[] trapdoor = new byte[HASH_LEN];
        byte[] st = new byte[HASH_LEN];

        int wm = 10;
        int um = 10;
        int crt;
        int len = 0;

        HKeyGen(ks);
        crt = CLEN;
        HUpdate(ks, crt, keyword, WORD_LEN, wm, um, index);
        HTrapdoor(trapdoor, crt, ks, keyword, WORD_LEN);
        len = HSearch(trapdoor, CLEN, crt);

        System.out.printf("result= %d:\n", len);
    }

    public void HKeyGen(byte[] ks) {
        // 生成密钥的逻辑
        Arrays.fill(ks, (byte) 0xab); // 示例填充
    }

    public void HUpdate(byte[] ks, int crt, byte[] keyword, int wordLen, int wm, int um, byte[] index) {
        // 使用 StringRedisTemplate 执行 Redis 更新操作
        for (int i = 0; i < wm; i++) {
            for (int j = 0; j < um; j++) {
                String key = new String(keyword, StandardCharsets.UTF_8) + "_" + i + "_" + j;
                String value = new String(index, StandardCharsets.UTF_8);
                stringRedisTemplate.opsForValue().set(key, value);
            }
        }
    }

    public void HTrapdoor(byte[] trapdoor, int crt, byte[] ks, byte[] keyword, int wordLen) {
        // 生成陷门的逻辑
        System.arraycopy(keyword, 0, trapdoor, 0, wordLen);
    }

    public int HSearch(byte[] trapdoor, int clen, int crt) {
        // 执行搜索操作的逻辑
        return clen; // 示例返回值
    }
}
